package com.macro.mall.service;

import com.macro.mall.common.api.CommonPage;
import com.macro.mall.common.api.CommonResult;
import com.macro.mall.dto.*;
import com.macro.mall.model.PmsProduct;
import com.macro.mall.model.PmsProductVertifyRecord;
import com.macro.mall.model.PmsSkuStock;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 商品管理Service
 * Created by macro on 2018/4/26.
 */
public interface PmsProductService {
    /**
     * 创建商品
     */
    @Transactional(isolation = Isolation.DEFAULT,propagation = Propagation.REQUIRED)
    Long create(UmsAdminDTO admin, PmsProductParam productParam);

    /**
     * 根据商品编号获取更新信息
     */
    PmsProductResult getUpdateInfo(Long id);

    /**
     * 更新商品
     */
    @Transactional
    int update(UmsAdminDTO admin,Long id, PmsProductParam productParam);

    /**
     * 分页查询商品
     */
    List<CombinedPmsProduct> list(String currentUserName,PmsProductQueryParam productQueryParam, Integer pageSize, Integer pageNum);

    /**
     * 批量修改审核状态
     * @param ids 产品id
     * @param verifyStatus 审核状态
     * @param detail 审核详情
     */
    @Transactional
    int updateVerifyStatus(String currentUserName,List<Long> ids, Integer verifyStatus, String detail);

    /**
     * 批量修改商品上架状态
     * 未审核的不能上架
     * @author 高强
     * @Date 2020年9月5日
     * @return map中一个key为可以上架的商品，一个为不可上架的商品
     */
//    int updatePublishStatus(List<Long> ids, Integer publishStatus);
    CommonResult updatePublishStatus(List<Long> ids, Integer publishStatus);

    /**
     * 批量修改商品推荐状态
     */
    int updateRecommendStatus(List<Long> ids, Integer recommendStatus);

    /**
     * 批量修改新品状态
     */
    int updateNewStatus(List<Long> ids, Integer newStatus);

    /**
     * 批量删除商品
     */
    int updateDeleteStatus(List<Long> ids, Integer deleteStatus);

    /**
     * 根据商品名称或者货号模糊查询
     */
    List<PmsProduct> list(String currentUserName, String keyword);

    /**
     * 创建组合商品
     * @author zhouboyu
     * @Date 2020年9月2日
     * @param admin
     * @param productParam
     * @return
     */
    Long createCombined(UmsAdminDTO admin, PmsProductParam productParam);

    /**
     * 修改组合商品
     * @author zhouboyu
     * @Date 2020年9月3日
     * @param admin
     * @param id
     * @param productParam
     * @return
     */
    int updateCombined(UmsAdminDTO admin, Long id, PmsProductParam productParam);
    /**
     * 根据商品id获取商品规格信息
     * 用于审核商品时查看
     * @author 孙晓亮
     * @Date 2020年9月12日
     * @param id 商品id
     * @return
     */
    List<PmsSkuStock> gerProductSkuInfo(Long id);
    /**
     * 根据商品id查询商品审核失败原因
     * @author 孙晓亮
     * @Data 2020年9月12日
     * @param id 商品id
     * @return
     */
    PmsProductVertifyRecord getProductVertifyDetail(Long id);

    /**
     * 查询组合商品
     * @param currentUserName
     * @param productQueryParam
     * @param pageSize
     * @param pageNum
     * @return
     */
    List<CombinedPmsProduct> getCombinedProductList(String currentUserName, PmsProductQueryParam productQueryParam, Integer pageSize, Integer pageNum);
    /**
     * 根据skuid查询商品信息
     * @author 孙晓亮
     * @Date 2020年9月16日
     * @param ids
     * @return
     */
    CommonResult getProductInfoBySkuId(List<Long> ids);

//    /**
//     * 入库
//     * 显示普通商品及规格
//     * @param currentUsername
//     * @return
//     */
//    CommonPage<PmsInProductSkuDto> getProductSku(String currentUsername, String productName, Integer pageSize, Integer pageNum);

    /**
     * 查询所有出库商品列表
     */
    CommonPage<PmsOutProductSkuDto> getOutProductList(String currentUserName,String productName, Integer type, Integer pageSize, Integer pageNum,Integer judgeStock);

    /**
     * 根据skuid查询商品信息
     * @param ids
     * @return
     */
    CommonResult getProductByids(List<Long> ids);

    /**
     * 根据主商品id查询子商品信息
     * @param id
     * @return
     */
    CommonResult<List<ProductDeitail>> getCombined(Long id);

    /**
     * 查看商品是否已审核
     * @param id
     * @return true已审核；false未审核
     */
    boolean whetherVerify(Long id);
}
